package com.library.controller;

import com.library.dto.BorrowRecordDTO;
import com.library.exception.BusinessException;
import com.library.exception.ForbiddenException;
import com.library.service.BorrowService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 借阅控制器
 * 处理图书借阅、归还相关的HTTP请求
 */
@Slf4j
@RestController
@RequestMapping("/api/borrow")
@RequiredArgsConstructor
public class BorrowController {
    // 注入借阅服务，处理业务逻辑
    private final BorrowService borrowService;

    /**
     * 借阅图书接口
     * POST /api/borrow/borrow
     * 用户借阅图书，会创建借阅记录并减少库存
     * 
     * @param request 请求体，包含book_id（图书ID）
     * @param userId 用户ID（从JWT中获取）
     * @return 借阅结果，包含借阅记录ID
     */
    @PostMapping("/borrow")
    public ResponseEntity<Map<String, Object>> borrowBook(
            @RequestBody Map<String, Long> request,
            @RequestAttribute Long userId) {
        
        // 获取图书ID
        Long bookId = request.get("book_id");
        if (bookId == null) {
            throw new BusinessException("图书ID不能为空");
        }
        
        // 调用服务层处理借阅
        BorrowRecordDTO record = borrowService.borrowBook(userId, bookId);
        Map<String, Object> response = new HashMap<>();
        response.put("message", "借阅成功");
        response.put("record_id", record.getId());
        return ResponseEntity.ok(response);
    }

    /**
     * 申请归还图书接口
     * POST /api/borrow/return
     * 用户提交归还申请，状态变为pending_return，等待管理员确认
     * 
     * @param request 请求体，包含record_id（借阅记录ID）
     * @param userId 用户ID（从JWT中获取）
     * @return 归还申请结果
     */
    @PostMapping("/return")
    public ResponseEntity<Map<String, String>> returnBook(
            @RequestBody Map<String, Long> request,
            @RequestAttribute Long userId) {
        
        // 获取借阅记录ID
        Long recordId = request.get("record_id");
        if (recordId == null) {
            throw new BusinessException("借阅记录ID不能为空");
        }
        
        // 调用服务层处理归还申请
        borrowService.returnBook(userId, recordId);
        Map<String, String> response = new HashMap<>();
        response.put("message", "归还申请已提交，等待管理员确认");
        return ResponseEntity.ok(response);
    }

    /**
     * 管理员确认归还接口
     * POST /api/borrow/confirm-return
     * 管理员确认归还后，更新记录状态并恢复库存
     * 
     * @param request 请求体，包含record_id（借阅记录ID）
     * @param role 用户角色（从JWT中获取）
     * @return 确认结果
     */
    @PostMapping("/confirm-return")
    public ResponseEntity<Map<String, String>> confirmReturn(
            @RequestBody Map<String, Long> request,
            @RequestAttribute String role) {
        
        // 检查管理员权限
        if (!"admin".equals(role)) {
            throw new ForbiddenException("需要管理员权限");
        }
        
        // 获取借阅记录ID
        Long recordId = request.get("record_id");
        if (recordId == null) {
            throw new BusinessException("借阅记录ID不能为空");
        }
        
        // 调用服务层确认归还
        borrowService.confirmReturn(recordId);
        Map<String, String> response = new HashMap<>();
        response.put("message", "确认归还成功");
        return ResponseEntity.ok(response);
    }

    /**
     * 获取当前借阅列表接口
     * GET /api/borrow/current
     * 普通用户只能查看自己的，管理员可以查看所有的
     * 
     * @param userId 用户ID（从JWT中获取）
     * @param role 用户角色（从JWT中获取）
     * @return 当前借阅记录列表
     */
    @GetMapping("/current")
    public ResponseEntity<Map<String, List<BorrowRecordDTO>>> getCurrentBorrows(
            @RequestAttribute Long userId,
            @RequestAttribute String role) {
        
        // 判断是否为管理员
        boolean isAdmin = "admin".equals(role);
        // 调用服务层获取当前借阅
        List<BorrowRecordDTO> records = borrowService.getCurrentBorrows(userId, isAdmin);
        
        Map<String, List<BorrowRecordDTO>> response = new HashMap<>();
        response.put("records", records);
        return ResponseEntity.ok(response);
    }

    /**
     * 获取借阅记录列表接口
     * GET /api/borrow/records?status=xxx
     * 支持按状态筛选，普通用户只能查看自己的，管理员可以查看所有的
     * 
     * @param status 借阅状态（可选），borrowed/pending_return/returned
     * @param userId 用户ID（从JWT中获取）
     * @param role 用户角色（从JWT中获取）
     * @return 借阅记录列表
     */
    @GetMapping("/records")
    public ResponseEntity<Map<String, List<BorrowRecordDTO>>> getBorrowRecords(
            @RequestParam(required = false) String status,
            @RequestAttribute Long userId,
            @RequestAttribute String role) {
        
        // 判断是否为管理员
        boolean isAdmin = "admin".equals(role);
        // 调用服务层获取借阅记录
        List<BorrowRecordDTO> records = borrowService.getBorrowRecords(userId, isAdmin, status);
        
        Map<String, List<BorrowRecordDTO>> response = new HashMap<>();
        response.put("records", records);
        return ResponseEntity.ok(response);
    }

    /**
     * 管理员添加借阅记录接口
     * POST /api/borrow/add-record
     * 管理员可以为任意用户创建借阅记录
     * 
     * @param request 请求体，包含user_id（用户ID）和book_id（图书ID）
     * @param role 用户角色（从JWT中获取）
     * @return 添加结果，包含借阅记录ID
     */
    @PostMapping("/add-record")
    public ResponseEntity<Map<String, Object>> addBorrowRecord(
            @RequestBody Map<String, Long> request,
            @RequestAttribute String role) {
        
        // 检查管理员权限
        if (!"admin".equals(role)) {
            throw new ForbiddenException("需要管理员权限");
        }
        
        // 获取用户ID和图书ID
        Long userId = request.get("user_id");
        Long bookId = request.get("book_id");
        
        // 验证参数
        if (userId == null || bookId == null) {
            throw new BusinessException("用户ID和图书ID不能为空");
        }
        
        // 调用服务层创建借阅记录
        BorrowRecordDTO record = borrowService.borrowBook(userId, bookId);
        Map<String, Object> response = new HashMap<>();
        response.put("message", "添加成功");
        response.put("record_id", record.getId());
        return ResponseEntity.ok(response);
    }

    /**
     * 获取借阅统计接口
     * GET /api/borrow/statistics?user_id=xxx
     * 
     * @param user_id 用户ID（可选，管理员可以查看指定用户的统计）
     * @param userId 当前用户ID（从JWT中获取）
     * @param role 当前用户角色（从JWT中获取）
     * @return 借阅统计信息
     */
    @GetMapping("/statistics")
    public ResponseEntity<Map<String, Object>> getBorrowStatistics(
            @RequestParam(required = false) Long user_id,
            @RequestAttribute Long userId,
            @RequestAttribute String role) {
        
        boolean isAdmin = "admin".equals(role);
        Long targetUserId = (isAdmin && user_id != null) ? user_id : userId;
        
        Map<String, Object> statistics = borrowService.getBorrowStatistics(targetUserId, isAdmin);
        return ResponseEntity.ok(statistics);
    }
}
